package com.draby.fantasy.dataTypes;

import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

/**
 * 存放每个格子的信息
 * 能移动的方向与当前状态
 */
public class Block {
    /**
     * 该格是否可以向上移动
     */
    private boolean canUp;
    /**
     * 该格是否可以向下移动
     */
    private boolean canDown;
    /**
     * 该格是否可以向左移动
     */
    private boolean canLeft;
    /**
     * 该格是否可以向右移动
     */
    private boolean canRight;
    /**
     * 状态代码
     * -1：不可到达
     * 0：未访问过
     * 1：已访问过
     * 2：已访问过且四侧的 Block 均被访问过
     * 5：终点所在位置
     * 9：玩家当前所在位置
     */
    private int statusCode;

    /**
     * 在迷宫地图中的行索引
     */
    private int rowIdx;

    /**
     * 在迷宫地图中的列索引
     */
    private int colIdx;

    private static final Map<Integer, String> STATUS_CODE = new HashMap<>();

    static {
        STATUS_CODE.put(-1, "不可到达");
        STATUS_CODE.put(0, "未访问过");
        STATUS_CODE.put(1, "已访问过");
        STATUS_CODE.put(2, "周围均被访问过");
        STATUS_CODE.put(5, "终点");
        STATUS_CODE.put(9, "玩家");
    }

    public boolean isCanUp() {
        return canUp;
    }

    public void setCanUp(boolean canUp) {
        this.canUp = canUp;
    }

    public boolean isCanDown() {
        return canDown;
    }

    public void setCanDown(boolean canDown) {
        this.canDown = canDown;
    }

    public boolean isCanLeft() {
        return canLeft;
    }

    public void setCanLeft(boolean canLeft) {
        this.canLeft = canLeft;
    }

    public boolean isCanRight() {
        return canRight;
    }

    public void setCanRight(boolean canRight) {
        this.canRight = canRight;
    }

    public int getStatusCode() {
        return statusCode;
    }

    public void setStatusCode(int statusCode) {
        this.statusCode = statusCode;
    }

    public int getRowIdx() {
        return rowIdx;
    }

    public void setRowIdx(int rowIdx) {
        this.rowIdx = rowIdx;
    }

    public int getColIdx() {
        return colIdx;
    }

    public void setColIdx(int colIdx) {
        this.colIdx = colIdx;
    }

    /**
     * 无参构造函数，初始化格子信息
     */
    public Block() {
        canUp = false;
        canDown = false;
        canLeft = false;
        canRight = false;
        statusCode = 0;
    }

    /**
     * 带两个参数的构造函数，初始化在迷宫地图中的位置
     * @param rowIdx 迷宫地图中的行索引
     * @param colIdx 迷宫地图中的列索引
     */
    public Block(int rowIdx, int colIdx) {
        this();
        this.rowIdx = rowIdx;
        this.colIdx = colIdx;
    }

    /**
     * 带三个参数的构造函数，初始化在迷宫地图中的位置和状态码
     * @param rowIdx 迷宫地图中的行索引
     * @param colIdx 迷宫地图中的列索引
     * @param statusCode 初始状态码
     */
    public Block(int rowIdx, int colIdx, int statusCode) {
        this(rowIdx, colIdx);
        this.statusCode = statusCode;
    }

    /**
     * 重写 toString 方法，用于输出
     * @return 重写后的字符串
     */
    @Override
    public String toString() {
        return "向上: " + canUp + ", 向下: " + canDown + ", 向左: " + canLeft + ", 向右: " + canRight + ", 状态: " + STATUS_CODE.get(statusCode);
    }

    /**
     * 重写 equals 方法，用于比较两对象是否相同
     * @param obj 另一个对象
     * @return true: 两对象属性完全相同，否则返回 false
     */
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (!(obj instanceof Block)) {
            return false;
        }
        Block block = (Block) obj;
        return this.canUp == block.canUp && this.canDown == block.canDown && this.canLeft == block.canLeft && this.canRight == block.canRight && this.statusCode == block.statusCode && this.rowIdx == block.rowIdx && this.colIdx == block.colIdx;
    }

    /**
     * 重写 hashCode 方法
     * @return 该对象的 hashCode
     */
    @Override
    public int hashCode() {
        return Objects.hash(canUp, canDown, canLeft, canRight, statusCode, rowIdx, colIdx);
    }
}
